home *** CD-ROM | disk | FTP | other *** search
- lea.l String(pc),a0 ; Beispiel
- bsr.s Str2Long
- rts
- String DC.B "1000000",0
-
- ; == Str2Long ==
- ; == Eingabe: A0 - Zeiger auf den String mit der ==
- ; == positiven, ganzen Zahl. ==
- ; == Ausgabe: D0 - Zahl als Longword (sofern kein ==
- ; == kein Fehler auftrat) ==
- ; == D1 - enthält 0 bei fehlerfreier ==
- ; == Durchführung, 1 bei einem ==
- ; == Fehler und 2,falls die Zahl zu ==
- ; == groß ist. ==
- ; == A0 - zeigt bei fehlerfreier Durch- ==
- ; == führung auf das erste Zeichen ==
- ; == nach der Zahl ==
- ; == VORSICHT: Register D2 wird verwendet ! ==
-
- Str2Long move.b (a0)+,d0 ; erstes Zeichen
- sub.b #"0",d0 ; von ASCII-Code in Ziffer umwandeln
- cmp.b #9,d0 ; größer als 9 ?
- bhi.s Error ; erstes Zeichen ist keine Ziffer !
- moveq.l #0,d1 ; alle Bits in D1 löschen
-
- Loop move.b (a0)+,d1 ; nächste Ziffer
- sub.b #"0",d1 ; von ASCII-Code in Ziffer umwandeln
- cmp.b #9,d1 ; größer als 9 ?
- bhi.s End ; Zeichen gehört nicht mehr zu Zahl
-
- add.l d0,d0 ; Inhalt von D0 mit 10 multiplizieren:
- bcs.s Overflow ; 10*D0 = 2^2*2*D0 + 2*D0
- move.l d0,d2
- add.l d2,d2
- bcs.s Overflow ; Der MULU-Befehl kann nicht angewandt
- add.l d2,d2 ; werden, da dieser nur 16-Bit-Zahlen
- bcs.s Overflow ; multipliziert.
- add.l d2,d0
- bcs.s Overflow
-
- add.l d1,d0 ; Ziffer addieren
- bcc.s Loop ; Falls kein Overflow, gehe zu 'Loop'
-
- Overflow moveq.l #2,d1 ; Zahl ist zu groß !
- rts
-
- End subq.l #1,a0 ; A0 zeigt das nächste Zeichen nach der Zahl
- moveq.l #0,d1 ; es trat kein Fehler auf
- rts
-
- Error moveq.l #1,d1 ; Fehler !
- rts
-